package com.yunke.common.util;

import java.util.Random;

/**
 * 邀请码生成工具类
 * 
 * @author yunke
 * @since 1.0.0
 */
public class YunkeInviteCodeUtil {

    /**
     * 邀请码字符集（排除容易混淆的字符）
     */
    private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    
    /**
     * 邀请码长度
     */
    private static final int CODE_LENGTH = 6;

    private static final Random RANDOM = new Random();

    private YunkeInviteCodeUtil() {
        // 工具类不允许实例化
    }

    /**
     * 生成邀请码
     * 
     * @return 邀请码
     */
    public static String generateInviteCode() {
        StringBuilder code = new StringBuilder();
        
        for (int i = 0; i < CODE_LENGTH; i++) {
            code.append(CHARS.charAt(RANDOM.nextInt(CHARS.length())));
        }
        
        return code.toString();
    }

    /**
     * 生成指定长度的邀请码
     * 
     * @param length 长度
     * @return 邀请码
     */
    public static String generateInviteCode(int length) {
        if (length < 4) {
            length = 4;
        }
        if (length > 10) {
            length = 10;
        }
        
        StringBuilder code = new StringBuilder();
        
        for (int i = 0; i < length; i++) {
            code.append(CHARS.charAt(RANDOM.nextInt(CHARS.length())));
        }
        
        return code.toString();
    }

    /**
     * 验证邀请码格式
     * 
     * @param inviteCode 邀请码
     * @return 是否有效
     */
    public static boolean isValidInviteCode(String inviteCode) {
        if (inviteCode == null || inviteCode.trim().isEmpty()) {
            return false;
        }
        
        String code = inviteCode.trim().toLowerCase();
        
        // 长度检查
        if (code.length() < 4 || code.length() > 10) {
            return false;
        }
        
        // 字符检查
        for (char c : code.toCharArray()) {
            if (CHARS.indexOf(c) == -1) {
                return false;
            }
        }
        
        return true;
    }

    /**
     * 生成唯一邀请码（基于时间戳）
     * 
     * @param userId 用户ID（可选）
     * @return 邀请码
     */
    public static String generateUniqueInviteCode(Long userId) {
        // 获取当前时间戳的后6位
        long timestamp = System.currentTimeMillis();
        String timestampStr = String.valueOf(timestamp);
        String suffix = timestampStr.substring(Math.max(0, timestampStr.length() - 6));
        
        // 转换为自定义字符集
        StringBuilder code = new StringBuilder();
        long num = Long.parseLong(suffix);
        
        if (userId != null) {
            // 如果有用户ID，混合用户ID和时间戳
            num = num ^ (userId % 1000000);
        }
        
        while (num > 0) {
            int index = (int) (num % CHARS.length());
            code.append(CHARS.charAt(index));
            num = num / CHARS.length();
        }
        
        // 如果长度不够，用随机字符补充
        while (code.length() < CODE_LENGTH) {
            int index = RANDOM.nextInt(CHARS.length());
            code.append(CHARS.charAt(index));
        }
        
        return code.toString();
    }
} 